GtkCssImageSurface: set device scale for cache surface
authorJuan Pablo Ugarte <ugarte@endlessm.com>
Mon, 5 Mar 2018 17:47:00 +0000 (14:47 -0300)
committerJuan Pablo Ugarte <ugarte@endlessm.com>
Mon, 5 Mar 2018 17:47:00 +0000 (14:47 -0300)
Closes #63

gtk/gtkcssimagesurface.c

index 8c439c9a52b80de30720a32aac6849bbfa581f58..f6f694aff7780fe1b9527381e1fec87f3e3bd263 100644 (file)
@@ -60,8 +60,14 @@ gtk_css_image_surface_draw (GtkCssImage *image,
       ABS (width - surface->width) > 0.001 ||
       ABS (height - surface->height) > 0.001)
     {
+      double xscale, yscale;
       cairo_t *cache;
 
+      /* We need the device scale (HiDPI mode) to calculate the proper size in
+       * pixels for the image surface and set the cache device scale
+       */
+      cairo_surface_get_device_scale (cairo_get_target (cr), &xscale, &yscale);
+
       /* Save original size to preserve precision */
       surface->width = width;
       surface->height = height;
@@ -72,8 +78,9 @@ gtk_css_image_surface_draw (GtkCssImage *image,
       /* Image big enough to contain scaled image with subpixel precision */
       surface->cache = cairo_surface_create_similar_image (surface->surface,
                                                            CAIRO_FORMAT_ARGB32,
-                                                           ceil (width),
-                                                           ceil (height));
+                                                           ceil (width*xscale),
+                                                           ceil (height*yscale));
+      cairo_surface_set_device_scale (surface->cache, xscale, yscale);
       cache = cairo_create (surface->cache);
       cairo_rectangle (cache, 0, 0, width, height);
       cairo_scale (cache, width / image_width, height / image_height);